home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1996 February / EnigmA AMIGA RUN 04 (1996)(G.R. Edizioni)(IT)[!][issue 1996-02][Skylink CD III].iso / earcd / assembler / progasm1.lha / SORGENTI2 / LEZIONE5a.s < prev    next >
Text File  |  1994-10-30  |  8KB  |  237 lines

  1.  
  2. ; Lezione5a.s    SCORRIMENTO DI UNA FIGURA A DESTRA E SINISTRA COL $dff102
  3.  
  4.     SECTION    CiriCop,CODE
  5.  
  6. Inizio:
  7.     move.l    4.w,a6        ; Execbase in a6
  8.     jsr    -$78(a6)    ; Disable - ferma il multitasking
  9.     lea    GfxName(PC),a1    ; Indirizzo del nome della lib da aprire in a1
  10.     jsr    -$198(a6)    ; OpenLibrary
  11.     move.l    d0,GfxBase    ; salvo l'indirizzo base GFX in GfxBase
  12.     move.l    d0,a6
  13.     move.l    $26(a6),OldCop    ; salviamo l'indirizzo della copperlist vecchia
  14.  
  15. ;     PUNTIAMO I NOSTRI BITPLANES
  16.  
  17.     MOVE.L    #PIC,d0        ; in d0 mettiamo l'indirizzo della PIC,
  18.     LEA    BPLPOINTERS,A1    ; puntatori nella COPPERLIST
  19.     MOVEQ    #2,D1        ; numero di bitplanes -1 (qua sono 3)
  20. POINTBP:
  21.     move.w    d0,6(a1)    ; copia la word BASSA dell'indirizzo del plane
  22.     swap    d0        ; scambia le 2 word di d0 (es: 1234 > 3412)
  23.     move.w    d0,2(a1)    ; copia la word ALTA dell'indirizzo del plane
  24.     swap    d0        ; scambia le 2 word di d0 (es: 3412 > 1234)
  25.     ADD.L    #40*256,d0    ; + lunghezza bitplane -> prossimo bitplane
  26.     addq.w    #8,a1        ; andiamo ai prossimi bplpointers nella COP
  27.     dbra    d1,POINTBP    ; Rifai D1 volte POINTBP (D1=num of bitplanes)
  28.  
  29. ;
  30.  
  31.     move.l    #COPPERLIST,$dff080    ; Puntiamo la nostra COP
  32.     move.w    d0,$dff088        ; Facciamo partire la COP
  33.  
  34.     move.w    #0,$dff1fc        ; Disattiva l'AGA
  35.     move.w    #$c00,$dff106        ; Disattiva l'AGA
  36.  
  37. mouse:
  38.     cmpi.b    #$ff,$dff006    ; Siamo alla linea 255?
  39.     bne.s    mouse        ; Se non ancora, non andare avanti
  40.  
  41.     btst    #2,$dff016    ; se il tasto destro e' premuto salta
  42.     beq.s    Aspetta        ; la routine dello scroll, bloccandolo
  43.  
  44.     bsr.s    MuoviCopper    ; fa scorrere col $dff102 la figura a destra
  45.                 ; e a sinistra (massimo 16 pixel)
  46.  
  47. Aspetta:
  48.     cmpi.b    #$ff,$dff006    ; Siamo alla linea 255?
  49.     beq.s    Aspetta        ; Se si, non andare avanti, aspetta!
  50.  
  51.     btst    #6,$bfe001    ; tasto sinistro del mouse premuto?
  52.     bne.s    mouse        ; se no, torna a mouse:
  53.  
  54.     move.l    OldCop(PC),$dff080    ; Puntiamo la cop di sistema
  55.     move.w    d0,$dff088        ; facciamo partire la vecchia cop
  56.  
  57.     move.l    4.w,a6
  58.     jsr    -$7e(a6)    ; Enable - riabilita il Multitasking
  59.     move.l    gfxbase(PC),a1    ; Base della libreria da chiudere
  60.     jsr    -$19e(a6)    ; Closelibrary - chiudo la graphics lib
  61.     rts            ; USCITA DAL PROGRAMMA
  62.  
  63. ;    Dati
  64.  
  65. GfxName:
  66.     dc.b    "graphics.library",0,0    
  67.  
  68. GfxBase:        ; Qua ci va l'indirizzo di base per gli Offset
  69.     dc.l    0    ; della graphics.library
  70.  
  71. OldCop:            ; Qua ci va l'indirizzo della vecchia COP di sistema
  72.     dc.l    0
  73.  
  74. ;    Questa routine e' simile a quella di Lezione3d.s, in questo caso
  75. ;    modifichiamo il valore del registro di scroll BPLCON1 $dff102 per
  76. ;    scorrere in avanti ed indietro la figura.
  77. ;    Essendo possibile agire separatamente sui bitplanes pari e su quelli
  78. ;    dispari, per spostare tutti i bitplanes dobbiamo spostarli
  79. ;    contemporaneamente: $0011,$0022,$0033 anziche' $0001,$0002,$0003 che
  80. ;    sposterebbe solo i bitplanes dispari (1,3,5), o $0010,$0020,$0030 che
  81. ;    sposterebbe solo i bitplanes pari (2,4,6).
  82. ;    Provate con un "=c 102" per vedere i bit del $dff102
  83.  
  84. MuoviCopper:
  85.     TST.B    FLAG        ; Dobbiamo avanzare o indietreggiare? se
  86.                 ; FLAG e' azzerata, (cioe' il TST verifica il
  87.                 ; BEQ)
  88.                 ; allora saltiamo a AVANTI, se invece e' a $FF
  89.                 ; (se cioe' questo TST non e' verificato)
  90.                 ; continuiamo indietreggiando (con dei sub)
  91.     beq.w    AVANTI
  92.     cmpi.b    #$00,MIOCON1    ; siamo arrivati alla posizione normale, ossia
  93.                 ; tutto indietro?
  94.     beq.s    MettiAvanti    ; se si, dobbiamo avanzare!
  95.     sub.b    #$11,MIOCON1    ; sottraiamo 1 allo scroll dei bitplanes
  96.     rts            ; dispari ($ff,$ee,$dd,$cc,$bb,$aa,$99....)
  97.                 ; andando a SINISTRA
  98. MettiAvanti:
  99.     clr.b    FLAG        ; Azzerando FLAG, al TST.B FLAG il BEQ
  100.     rts            ; fara' saltare alla routine AVANTI, e
  101.                 ; la figura avanzera' (verso destra)
  102.  
  103. AVANTI:
  104.     cmpi.b    #$ff,MIOCON1    ; siamo arrivati allo scroll massimo in
  105.                 ; avanti, ossia $FF? ($f pari e $f dispari)
  106.     beq.s    MettiIndietro    ; se si, siamo dobbiamo tornare indietro
  107.     add.b    #$11,MIOCON1    ; aggiungiamo 1 allo scroll dei bitplanes
  108.                 ; pari e dispari ($11,$22,$33,$44 etc..)
  109.     rts            ; ANDANDO A DESTRA
  110.  
  111. MettiIndietro:
  112.     move.b    #$ff,FLAG    ; Quando la label FLAG non e' a zero,
  113.     rts            ; significa che dobbiamo indietreggiare
  114.                 ; verso sinistra
  115.  
  116. ;    Questo byte e' un FLAG, ossia serve per indicare se andare avanti o
  117. ;    indietro.
  118.  
  119. FLAG:
  120.     dc.b    0,0
  121.  
  122.  
  123.     SECTION    GRAPHIC,DATA_C
  124.  
  125. COPPERLIST:
  126.     dc.w    $120,$0000,$122,$0000,$124,$0000,$126,$0000,$128,$0000 ; SPRITE
  127.     dc.w    $12a,$0000,$12c,$0000,$12e,$0000,$130,$0000,$132,$0000
  128.     dc.w    $134,$0000,$136,$0000,$138,$0000,$13a,$0000,$13c,$0000
  129.     dc.w    $13e,$0000
  130.  
  131.     dc.w    $8e,$2c81    ; DiwStrt    (registri con valori normali)
  132.     dc.w    $90,$2cc1    ; DiwStop
  133.     dc.w    $92,$0038    ; DdfStart
  134.     dc.w    $94,$00d0    ; DdfStop
  135.  
  136.  
  137.     dc.w    $102        ; BplCon1 - IL REGISTRO
  138.     dc.b    $00        ; BplCon1 - IL BYTE NON UTILIZZATO!!!
  139. MIOCON1:
  140.     dc.b    $00        ; BplCon1 - IL BYTE UTILIZZATO!!!
  141.  
  142.  
  143.     dc.w    $104,0        ; BplCon2
  144.     dc.w    $108,0        ; Bpl1Mod
  145.     dc.w    $10a,0        ; Bpl2Mod
  146.  
  147.             ; 5432109876543210    ; BPLCON0:
  148.     dc.w    $100,%0011001000000000    ; bits 13 e 12 accesi!! (3 = %011)
  149.                     ; 3 bitplanes lowres, non lace
  150. BPLPOINTERS:
  151.     dc.w $e0,$0000,$e2,$0000    ;primo     bitplane - BPL0PT
  152.     dc.w $e4,$0000,$e6,$0000    ;secondo bitplane - BPL1PT
  153.     dc.w $e8,$0000,$ea,$0000    ;terzo     bitplane - BPL2PT
  154.  
  155.     dc.w    $0180,$000    ; color0
  156.     dc.w    $0182,$475    ; color1
  157.     dc.w    $0184,$fff    ; color2
  158.     dc.w    $0186,$ccc    ; color3
  159.     dc.w    $0188,$999    ; color4
  160.     dc.w    $018a,$232    ; color5
  161.     dc.w    $018c,$777    ; color6
  162.     dc.w    $018e,$444    ; color7
  163.  
  164.     dc.w    $FFFF,$FFFE    ; Fine della copperlist
  165.  
  166. ;    figura
  167.  
  168. PIC:
  169.     incbin    "amiga.320*256*3"    ; qua carichiamo la figura in RAW,
  170.                     ; convertita col KEFCON, fatta di
  171.                     ; 3 bitplanes consecutivi
  172.  
  173.     end
  174.  
  175. Spostare lo schermo in avanti di 16 pixel sull'Amiga e' uno scherzo! basta
  176. modificare un byte, quello del $dff102, e il gioco e' fatto. Su altri sistemi
  177. grafici di computer come il PC MSDOS invece bisogna proprio modificare tutta
  178. la figura e "spostarla", con moltissime istruzioni che rallentano tutto.
  179. Inoltre si possono spostare separatamente i planes pari e quelli dispari, in
  180. modo da creare facilmente effetti di parallasse, basta far scorrere piu'
  181. lentamente lo sfondo, fatto dai bitplanes dispari, e piu' velocemente il
  182. primo piano, fatto ad esempio dai bitplanes pari. Non per niente per fare una
  183. parallasse sul PC occorre fare routines complicatissime e lente.
  184. Verifichiamo che e' possibile scorrere i bitplanes pari e dispari separatamente
  185. con queste due modifiche; per scorrere SOLO i bitplanes PARI (qua c'e' il 2
  186. solamente) cambiate queste istruzioni
  187.  
  188.  
  189.     sub.b    #$11,MIOCON1    ; sottraiamo 1 allo scroll dei bitplanes
  190.  
  191.     cmpi.b    #$ff,MIOCON1    ; siamo arrivati allo scroll massimo in
  192.  
  193.     add.b    #$11,MIOCON1    ; aggiungiamo 1 allo scroll dei bitplanes
  194.                 ; pari e dispari ($11,$22,$33,$44 etc..)
  195.  
  196. in questo modo:
  197.  
  198.  
  199.     sub.b    #$10,MIOCON1    ; solo i planes PARI!
  200.  
  201.     cmpi.b    #$f0,MIOCON1
  202.  
  203.     add.b    #$10,MIOCON1
  204.  
  205. Noterete che si muove un solo bitplane, il 2, mentre il primo ed il terzo
  206. rimangono al loro posto. Nello spostarsi il bitplane 2 rimane "allo scoperto",
  207. ossia perde la sovrapposizione con gli altri 2 mostrando la sua "VERA FACCIA",
  208. e assumendo il COLOR2, che e' a $FFF nella copperlist come potete vedere,
  209. infatti e' bianco. Assume il color2 perche' spostandosi il bitplane 2 si
  210. trova "solo" con lo sfondo, ossia: %010, con i bitplane 1 e 3 azzerati.
  211. Il numero binario %010 equivale a 2, dunque il suo colore sara' deciso dal
  212. registro colore 2, il $dff184. cambiate nella copperlist il suo valore e
  213. verificherete che il bitplane 2 "da solo" e' controllato proprio da quel
  214. registro:
  215.  
  216.     dc.w    $0184,$fff    ; color2
  217.  
  218. Infatti mettendo, ad esempio, un $ff0, diventera' giallo. D'altronde la figura
  219. rimane "BUCATA" nei punti dove il bitplane2 "SE NE VA", potete vederlo meglio
  220. premendo il tasto destro che blocca lo scorrimento: in particolare i buchi
  221. si notano dove compare il BIANCO, ossia dove c'era solo il bitplane2 senza
  222. sovrapposizioni. In altri casi anziche' formarsi un BUCO cambia il colore.
  223.  
  224. Per far scorrere solo i bitplanes DISPARI (1 e 3 nella nostra figura), invece,
  225. modificate la routine cosi':
  226.  
  227.     subq.b    #$01,MIOCON1    ; solo i planes DISPARI!
  228.  
  229.     cmpi.b    #$0f,MIOCON1
  230.  
  231.     addq.b    #$01,MIOCON1
  232.  
  233. In questo caso rimane fermo il bitplane2, l'unico pari, e si muovono i plane
  234. 1 e 3, i dispari.
  235. Con questo esempi avete potuto verificare anche il metodo della sovrapposizione
  236. dei bitplane per visualizzare i vari colori.
  237.